float G3n0_GetVecSpread(float speed)
{	
	float spread;
	int recoil;
	recoil = me.spread.recoil;
	int id;

	id = playerItems.CurrentID();

	switch (id)
	{
		case WEAPONLIST_DEAGLE:
			if (me.spread.prcflags & FL_ONGROUND)
			{
					if (speed && me.spread.recoil == 0)
						spread = 0.2175 * (1.0f - me.spread.spreadvar);
					else if (me.spread.recoil<1)
						spread = 0.219f;
					else if (me.spread.recoil<2)
						spread = 0.22f;
					else if (me.spread.recoil<3)
						spread = 0.2205f;
					else if (me.spread.recoil<4)
						spread = 0.2215f;
					else if (me.spread.recoil<5)
						spread = 0.222f;
					else if (me.spread.recoil<6)
						spread = 0.224f;
					else if (me.spread.recoil<7)
						spread = 0.2245f;
					else if (me.spread.prcflags & FL_DUCKING)
						spread = 0.115 * (1.0f - me.spread.spreadvar);
					else
						spread = 0.13 * (1.0f - me.spread.spreadvar);
				}		
				else
					spread = 1.5 * (1.0f - me.spread.spreadvar);
			break;
		case WEAPONLIST_ELITE:
			if (me.spread.prcflags & FL_ONGROUND)
			{
				if (speed)
					spread = 0.175 * (1.0f - me.spread.spreadvar);
				else if (me.spread.prcflags & FL_DUCKING)
					spread = 0.08 * (1.0f - me.spread.spreadvar);
				else
					spread = 0.1 * (1.0f - me.spread.spreadvar);
			}
			else
				spread = 1.3 * (1.0f - me.spread.spreadvar);

			break;
		case WEAPONLIST_FIVESEVEN:
			if (me.spread.prcflags & FL_ONGROUND)
			{
				if (speed)
					spread = 0.255 * (1.0f - me.spread.spreadvar);
				else if (me.spread.prcflags & FL_DUCKING)
					spread = 0.075 * (1.0f - me.spread.spreadvar);
				else
					spread = 0.15 * (1.0f - me.spread.spreadvar);
			}
			else
				spread = 1.5 * (1.0f - me.spread.spreadvar);

			break;
		case WEAPONLIST_GLOCK18:
			if (!(me.spread.WeaponState & GLOCK18_BURST))
			{
				if (me.spread.prcflags & FL_ONGROUND)
				{
					if (speed)
						spread = 0.165 * (1.0f - me.spread.spreadvar);
					else if (me.spread.prcflags & FL_DUCKING)
						spread = 0.075 * (1.0f - me.spread.spreadvar);
					else
						spread = 0.1 * (1.0f - me.spread.spreadvar);
				}
				else
					spread = 1.0f - me.spread.spreadvar;
			}
			else
				spread = 0;

			break;
		case WEAPONLIST_P228:
			if (me.spread.prcflags & FL_ONGROUND)
			{
				if (speed)
					spread = 0.255 * (1.0f - me.spread.spreadvar);
				else if (me.spread.prcflags & FL_DUCKING)
					spread = 0.075 * (1.0f - me.spread.spreadvar);
				else
					spread = 0.15 * (1.0f - me.spread.spreadvar);
			}
			else
				spread = 1.5 * (1.0f - me.spread.spreadvar);

			break;
		case WEAPONLIST_G3SG1:
			if (me.spread.prcflags & FL_ONGROUND)
			{
				if (speed)
					spread = 0.15f;
				else if (me.spread.prcflags & FL_DUCKING)
					spread = 0.035 * (1.0f - me.spread.spreadvar);
				else
					spread = 0.055 * (1.0f - me.spread.spreadvar);
			}
			else
				spread = 0.45 * (1.0f - me.spread.spreadvar);

			if (!(me.iFOV < 90.0f))
				spread += 0.025f;

			break;
		case WEAPONLIST_SG550:
			if (me.spread.prcflags & FL_ONGROUND)
			{
				if (speed)
					spread = 0.15f;
				else if (me.spread.prcflags & FL_DUCKING)
					spread = 0.04 * (1.0f - me.spread.spreadvar);
				else
					spread = 0.05 * (1.0f - me.spread.spreadvar);
			}
			else
				spread = 0.45 * (1.0f - me.spread.spreadvar);

			if (!(me.iFOV < 90.0f))
				spread += 0.025f;

			break;
		case WEAPONLIST_USP:
			if (!(me.spread.WeaponState & USP_SILENCER))
			{
				if (me.spread.prcflags & FL_ONGROUND)
				{
					if (speed)
						spread = 0.225 * (1.0f - me.spread.spreadvar);
					else if (me.spread.prcflags & FL_DUCKING)
						spread = 0.08 * (1.0f - me.spread.spreadvar);
					else
						spread = 0.1 * (1.0f - me.spread.spreadvar);
				}
				else
					spread = 1.2 * (1.0f - me.spread.spreadvar);
			}
			else
			{
				if (me.spread.prcflags & FL_ONGROUND)
				{
					if (speed)
						spread = 0.25 * (1.0f - me.spread.spreadvar);
					else if (me.spread.prcflags & FL_DUCKING)
						spread = 0.125 * (1.0f - me.spread.spreadvar);
					else
						spread = 0.15 * (1.0f - me.spread.spreadvar);
				}
				else
					spread = 1.3 * (1.0f - me.spread.spreadvar);
			}

			break;
		case WEAPONLIST_AK47:
			if (me.spread.prcflags & FL_ONGROUND)
			{
				if (speed > 140.0f && me.spread.recoil == 0)
					spread = me.spread.spreadvar*0.07 + 0.042955;
				else if (me.spread.recoil<5)
					spread = me.spread.spreadvar*0.07 + 0.043;
				else if (me.spread.recoil<10)
					spread = me.spread.spreadvar*0.07 + 0.043575;
				else if (me.spread.recoil<15)
					spread = me.spread.spreadvar*0.07 + 0.0440575;
				else if (me.spread.recoil<20)
					spread = me.spread.spreadvar*0.07 + 0.0447575;
				else if (me.spread.recoil<25)
					spread = me.spread.spreadvar*0.07 + 0.04558595;
				else if (me.spread.recoil<30)
					spread = me.spread.spreadvar*0.07 + 0.0462575285;

				if (me.spread.recoil == 0)
					spread = me.spread.spreadvar*0.0253;
				else if (me.spread.recoil<5)
					spread = me.spread.spreadvar*0.025425;
				else if (me.spread.recoil<10)
					spread = me.spread.spreadvar*0.025525;
				else if (me.spread.recoil<15)
					spread = me.spread.spreadvar*0.0255575;
				else if (me.spread.recoil<20)
					spread = me.spread.spreadvar*0.02565;
				else if (me.spread.recoil<25)
					spread = me.spread.spreadvar*0.025717;
				else if (me.spread.recoil<30)
					spread = me.spread.spreadvar*0.025895;
			}
			else if (me.spread.recoil == 0)
				spread = me.spread.spreadvar*0.43 + .0428;
			else if (me.spread.recoil <5)
				spread = me.spread.spreadvar*0.43 + .043;
			else if (me.spread.recoil<10)
				spread = me.spread.spreadvar*0.43 + .043275;
			else if (me.spread.recoil<15)
				spread = me.spread.spreadvar*0.43 + .04352;
			else if (me.spread.recoil<20)
				spread = me.spread.spreadvar*0.43 + .04372;
			else if (me.spread.recoil<25)
				spread = me.spread.spreadvar*0.43 + .043958;
			else if (me.spread.recoil<30)
				spread = me.spread.spreadvar*0.43 + .04405;

			break;
		case WEAPONLIST_SG552:
			if (me.spread.prcflags & FL_ONGROUND)
			{
				if (speed > 140.0f && me.spread.recoil == 0)
					spread = me.spread.spreadvar*0.07 + 0.035;
				else if (me.spread.recoil<5)
					spread = me.spread.spreadvar*0.07 + 0.0351575;
				else if (me.spread.recoil<10)
					spread = me.spread.spreadvar*0.07 + 0.03525;
				else if (me.spread.recoil<15)
					spread = me.spread.spreadvar*0.07 + 0.03545;
				else if (me.spread.recoil<20)
					spread = me.spread.spreadvar*0.07 + 0.0362575;
				else if (me.spread.recoil<25)
					spread = me.spread.spreadvar*0.07 + 0.0363595;
				else if (me.spread.recoil<30)
					spread = me.spread.spreadvar*0.07 + 0.037058596;
				
				if (me.spread.recoil == 0)
					spread = me.spread.spreadvar*0.02;
				else if (me.spread.recoil<5)
					spread = me.spread.spreadvar*0.020125;
				else if (me.spread.recoil<10)
					spread = me.spread.spreadvar*0.020225;
				else if (me.spread.recoil<15)
					spread = me.spread.spreadvar*0.0203575;
				else if (me.spread.recoil<20)
					spread = me.spread.spreadvar*0.02045;
				else if (me.spread.recoil<25)
					spread = me.spread.spreadvar*0.020517;
				else if (me.spread.recoil<30)
					spread = me.spread.spreadvar*0.020595;
			}
			else if (me.spread.recoil == 0)
				spread = me.spread.spreadvar*0.43 + .0358;
			else if (me.spread.recoil <5)
				spread = me.spread.spreadvar*0.43 + .036;
			else if (me.spread.recoil<10)
				spread = me.spread.spreadvar*0.43 + .036275;
			else if (me.spread.recoil<15)
				spread = me.spread.spreadvar*0.43 + .03652;
			else if (me.spread.recoil<20)
				spread = me.spread.spreadvar*0.43 + .03672;
			else if (me.spread.recoil<25)
				spread = me.spread.spreadvar*0.43 + .036958;
			else if (me.spread.recoil<30)
				spread = me.spread.spreadvar*0.43 + .03705;

			break;
		case WEAPONLIST_AUG:
			if (me.spread.prcflags & FL_ONGROUND)	
			{				
				if (speed > 140.0f)		
					spread = me.spread.spreadvar * 0.07 + 0.035;	
				else				
					spread = me.spread.spreadvar * 0.02;	
			}			
			else			
				spread = me.spread.spreadvar * 0.4 + .035;

			break;
		case WEAPONLIST_M249:
			if (me.spread.prcflags & FL_ONGROUND)
			{				
				if (speed > 140.0f)		
				{
					if (me.spread.recoil == 0)	
						spread = 0.064f;		
					else if (me.spread.recoil< 6)		
						spread = 0.083f;	
					else					
						spread = 0.1305f;	
				}
				else
			{
					if (me.spread.recoil == 0)			
						spread = 0.006f;		
					else if (me.spread.recoil< 6)		
						spread = 0.012f;		
					else					
						spread = 0.027f;
				}
			}				
			else	
			{
				if (me.spread.recoil == 0)		
					spread = 0.145f;			
				else if (me.spread.recoil< 6)				
					spread = 0.245f;			
				else				
					spread = 0.495f;	
			}
			break;
		case WEAPONLIST_M4A1:
			if (me.spread.prcflags & FL_ONGROUND)
			{
				if (!(me.spread.WeaponState & M4A1_SILENCER))
				{
					if (speed > 140.0f)
						spread = me.spread.spreadvar*0.07 + 0.035;
					else
						spread = me.spread.spreadvar*0.02;
				}
				else
				{
				if (speed > 140.0f && me.spread.recoil == 0)
					spread = me.spread.spreadvar*0.07 + 0.03505;
				else if (me.spread.recoil<5)
					spread = me.spread.spreadvar*0.07 + 0.0351;
				else if (me.spread.recoil<10)
					spread = me.spread.spreadvar*0.07 + 0.03515;
				else if (me.spread.recoil<15)
					spread = me.spread.spreadvar*0.07 + 0.0351595;
				else if (me.spread.recoil<20)
					spread = me.spread.spreadvar*0.07 + 0.0352575;
				else if (me.spread.recoil<25)
					spread = me.spread.spreadvar*0.07 + 0.0353595;
				else if (me.spread.recoil<30)
					spread = me.spread.spreadvar*0.07 + 0.035358596;
			
				if (me.spread.recoil == 0)
					spread = me.spread.spreadvar*0.02;
				else if (me.spread.recoil<5)
					spread = me.spread.spreadvar*0.020105;
				else if (me.spread.recoil<10)
					spread = me.spread.spreadvar*0.020275;
				else if (me.spread.recoil<15)
					spread = me.spread.spreadvar*0.020325;
				else if (me.spread.recoil<20)
					spread = me.spread.spreadvar*0.020425;
				else if (me.spread.recoil<25)
					spread = me.spread.spreadvar*0.020515;
				else if (me.spread.recoil<30)
					spread = me.spread.spreadvar*0.0206175;
				}
			}
			else if (me.spread.recoil == 0)
				spread = me.spread.spreadvar*0.43 + .0368;
			else if (me.spread.recoil <5)
				spread = me.spread.spreadvar*0.43 + .0369;
			else if (me.spread.recoil<10)
				spread = me.spread.spreadvar*0.43 + .03715;
			else if (me.spread.recoil<15)
				spread = me.spread.spreadvar*0.43 + .03752;
			else if (me.spread.recoil<20)
				spread = me.spread.spreadvar*0.43 + .03772;
			else if (me.spread.recoil<25)
				spread = me.spread.spreadvar*0.43 + .0437958;
			else if (me.spread.recoil<30)
				spread = me.spread.spreadvar*0.43 + .03705;

			break;
		case WEAPONLIST_MP5:
			if (me.spread.prcflags & FL_ONGROUND)
			{			
				if (speed > 120.0f)	
				{				
					if (me.spread.recoil == 0)		
						spread = 0.0f;			
					else if (me.spread.recoil < 2)	
						spread = 0.022543f;			
					else if (me.spread.recoil < 3)		
						spread = 0.018727f;			
					else if (me.spread.recoil < 4)		
						spread = 0.019636f;			
					else if (me.spread.recoil < 5)		
						spread = 0.020908f;				
					else if (me.spread.recoil < 6)		
						spread = 0.022543f;				
					else if (me.spread.recoil < 7)		
						spread = 0.024542f;				
					else if (me.spread.recoil < 8)		
						spread = 0.026905f;				
					else if (me.spread.recoil < 9)		
						spread = 0.029631f;				
					else		
						spread = 0.03f;	
				}	
				else		
				{			
					if (me.spread.recoil == 0)		
						spread = 0.0f;		
					else if (me.spread.recoil < 2)		
						spread = 0.022543f;			
					else if (me.spread.recoil < 3)		
						spread = 0.018727f;				
					else if (me.spread.recoil < 4)		
						spread = 0.019636f;				
					else if (me.spread.recoil < 5)		
						spread = 0.020908f;				
					else if (me.spread.recoil < 6)			
						spread = 0.022543f;				
					else if (me.spread.recoil < 7)		
						spread = 0.024542f;				
					else if (me.spread.recoil < 8)		
						spread = 0.026905f;				
					else if (me.spread.recoil < 9)		
						spread = 0.029631f;				
					else					
						spread = 0.03f;			
				}		
			}		
			else		
			{			
				if (me.spread.recoil == 0)		
					spread = 0.0f;			
				else if (me.spread.recoil < 2)		
					spread = 0.090909f;			
				else if (me.spread.recoil < 3)		
					spread = 0.093635f;			
				else if (me.spread.recoil < 4)			
					spread = 0.098178f;				
				else if (me.spread.recoil < 5)		
					spread = 0.104539f;			
				else if (me.spread.recoil < 6)		
					spread = 0.112717f;				
				else if (me.spread.recoil < 7)			
					spread = 0.122712f;				
				else if (me.spread.recoil < 8)			
					spread = 0.134525f;				
				else if (me.spread.recoil < 9)			
					spread = 0.148155f;				
				else				
					spread = 0.15f;	
			}	
			break;
		case WEAPONLIST_MAC10:
		if (me.spread.prcflags & FL_ONGROUND)	
			spread = 0.03 * me.spread.spreadvar;	
		else			
			spread = 0.375 * me.spread.spreadvar;

			break;
		case WEAPONLIST_P90:
			if (me.spread.prcflags & FL_ONGROUND)
			{
				if (speed > 170.0f)
					spread = me.spread.spreadvar * 0.115;
				else
					spread = me.spread.spreadvar * 0.045;
			}
			else
				spread = me.spread.spreadvar * 0.3;

			break;
		case WEAPONLIST_TMP:
			if (me.spread.prcflags & FL_ONGROUND)
				spread = 0.03 * me.spread.spreadvar;
			else
				spread = 0.25 * me.spread.spreadvar;

			break;
		case WEAPONLIST_UMP45:
			if (me.spread.prcflags & FL_ONGROUND)
				spread = 0.04 * me.spread.spreadvar;
			else
				spread = 0.24 * me.spread.spreadvar;

			break;
		case WEAPONLIST_AWP:
		if (me.spread.prcflags & FL_ONGROUND)
			{
				if (speed < 10.0f)
				{
					if (me.spread.prcflags & FL_DUCKING)
						spread = 0;
					else
						spread = 0.001f;
				}
				else if (speed < 140.0f)
				{
					spread = 0.1f;
				}
				else
					spread = 0.25f;
			}
			else
				spread = 0.85f;

			if (!(me.iFOV < 90.0f))
				spread += 0.08f;

			break;
		case WEAPONLIST_SCOUT:
		if (me.spread.prcflags & FL_ONGROUND)
			{
				if (speed < 170.0f)
				{
					if (me.spread.prcflags & FL_DUCKING)
						spread = 0;
					else
						spread = 0.021f;
				}
				else
					spread = 0.087f;
			}
			else
				spread = 0.2104f;

			if (!(me.iFOV < 90.0f))
				spread += 0.028f;

			break;
		default:
			spread = 0;
			break;
	}

	return spread;
}
void GetSpreadXYZ(unsigned int seed, int future, float *velocity, float *vec)
{
	float vecspread, speed;

	vec[0] = UTIL_SharedRandomFloat(seed + future, -0.5, 0.5) + UTIL_SharedRandomFloat(seed + 1 + future, -0.5, 0.5);

	vec[1] = UTIL_SharedRandomFloat(seed + 2 + future, -0.5, 0.5) + UTIL_SharedRandomFloat(seed + 3 + future, -0.5, 0.5);

	speed = sqrt(velocity[0] * velocity[0] + velocity[1] * velocity[1]);

	vecspread = G3n0_GetVecSpread(speed);

	vec[0] *= vecspread;
	vec[1] *= vecspread;

	return;
}
void GetRecoilOffsetX(unsigned int seed, int future, float *inangles, float *velocity, float *outangles)
{
	float forward[3], right[3], up[3], vecDir[3];
	float view[3], dest[3], spread[2];

	gEngfuncs.pfnAngleVectors(inangles, forward, right, up);

	GetSpreadXYZ(seed, future, velocity, spread);

	vecDir[0] = forward[0] + spread[0] * right[0] + spread[1] * up[0];
	view[0] = 8192 * vecDir[0];

	vecDir[1] = forward[1] + spread[0] * right[1] + spread[1] * up[1];
	view[1] = 8192 * vecDir[1];

	vecDir[2] = forward[2] + spread[0] * right[2] + spread[1] * up[2];
	view[2] = 8192 * vecDir[2];

	VectorAngles(view, dest);
	dest[0] *= -1;

	outangles[0] = inangles[0] - dest[0];
	outangles[1] = inangles[1] - dest[1];
	outangles[2] = 0;
}